package leetcode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 给你一个整数数组 nums ，判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ，
 * 同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
 * <p>
 * 注意：答案中不可以包含重复的三元组。
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [-1,0,1,2,-1,-4]
 * 输出：[[-1,-1,2],[-1,0,1]]
 * 解释：
 * nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
 * nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
 * nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
 * 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
 * 注意，输出的顺序和三元组的顺序并不重要。
 * 示例 2：
 * <p>
 * 输入：nums = [0,1,1]
 * 输出：[]
 * 解释：唯一可能的三元组和不为 0 。
 * 示例 3：
 * <p>
 * 输入：nums = [0,0,0]
 * 输出：[[0,0,0]]
 * 解释：唯一可能的三元组和为 0 。
 */
public class LeetCode15 {

    public static List<List<Integer>> threeSum(int[] nums) {

        List<List<Integer>> res = new ArrayList<>();
        List<List<Integer>> xb = new ArrayList<>();
//        Arrays.sort(nums);

        int numLength = nums.length;

        for (int i = 0; i < numLength; i++) {

            for (int j = i + 1; j < numLength; j++) {
                if (i == j) continue;
                for (int k = j + 1; k < numLength; k++) {
                    if (j == k) continue;
                    if (nums[i] + nums[j] + nums[k] == 0) {
                        boolean isHave = false;
                        for (List<Integer> integers : xb) {
                            boolean iHave = false;
                            boolean jHave = false;
                            boolean kHave = false;
                            for (Integer integer : integers) {
                                if (integer == i) {
                                    iHave = true;
                                }
                                if (integer == j) {
                                    jHave = true;
                                }
                                if (integer == k) {
                                    kHave = true;
                                }
                            }
                            if (iHave && jHave && kHave) {
                                isHave = true;
                            }


                        }
                        if (isHave) {
                            continue;
                        }
                        List<Integer> list = new ArrayList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[k]);
                        res.add(list);

                        List<Integer> xbN = new ArrayList<>();
                        xbN.add(i);
                        xbN.add(j);
                        xbN.add(k);
                        xb.add(xbN);
                    }
                }
            }

        }

        System.out.println("Arrays.toString(xb.toArray()) = " + Arrays.toString(xb.toArray()));


        return res;
    }


    public static void main(String[] args) {
        int[] nums = {-1, 0, 1, 2, -1, -4};

        List<List<Integer>> lists = threeSum(nums);
        System.out.println("lists.toArray() = " + Arrays.toString(lists.toArray()));


    }


}
